//package com.learn.myspring.beans.factory.xml;
//
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.core.util.XmlUtil;
//import com.learn.myspring.beans.BeansException;
//import com.learn.myspring.beans.PropertyValue;
//import com.learn.myspring.beans.factory.config.BeanDefinition;
//import com.learn.myspring.beans.factory.config.BeanReference;
//import com.learn.myspring.beans.factory.support.AbstractBeanDefinitionReader;
//import com.learn.myspring.beans.factory.support.BeanDefinitionRegistry;
//import com.learn.myspring.core.io.Resource;
//import com.learn.myspring.core.io.ResourceLoader;
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import org.w3c.dom.NodeList;
//
//import java.io.IOException;
//import java.io.InputStream;
//
///**
// * Description:
// * date: 2021/8/9 23:46
// * Package: com.learn.myspring.beans.factory.xml
// *
// * @author 李佳乐
// * @email 18066550996@163.com
// */
//@SuppressWarnings("all")
////解析XML处理Bean注册
//public class XmlBeanDefinitionReaderWithHuTool extends AbstractBeanDefinitionReader {
//
//    /**
//     * XmlBeanDefinitionReader类的最核心功能就是解析XML，把我们本来在代码中的操作通过解析xml自动注册的方式
//     */
//    public XmlBeanDefinitionReaderWithHuTool(BeanDefinitionRegistry registry) {
//        super(registry);
//    }
//
//    public XmlBeanDefinitionReaderWithHuTool(BeanDefinitionRegistry registry, ResourceLoader resourceLoader) {
//        super(registry, resourceLoader);
//    }
//
//    @Override
//    public void loadBeanDefinitions(Resource resource) throws BeansException {
//        try {
//            //try-with-resource写法，常用于关闭资源，不用在finally代码块中写一大堆关闭资源的代码
//            //括号里面的变量类型必须是closeable的子类
//            try (InputStream inputStream = resource.getInputStream()) {
//                doLoadBeanDefinitions(inputStream);
//            }
//        } catch (IOException | ClassNotFoundException e) {
//            throw new BeansException("IOException parsing XML document from " + resource, e);
//        }
//    }
//
//    @Override
//    public void loadBeanDefinitions(Resource... resources) throws BeansException {
//        for (Resource resource : resources) {
//            loadBeanDefinitions(resource);
//        }
//    }
//
//    @Override
//    public void loadBeanDefinitions(String location) throws BeansException {
//        ResourceLoader resourceLoader = getResourceLoader();
//        Resource resource = resourceLoader.getResource(location);
//        loadBeanDefinitions(resource);
//    }
//
//    @Override
//    public void loadBeanDefinitions(String... locations) throws BeansException {
//        for (String location : locations) {
//            loadBeanDefinitions(location);
//        }
//    }
//
//    protected void doLoadBeanDefinitions(InputStream inputStream) throws ClassNotFoundException {
//        Document document = XmlUtil.readXML(inputStream);
//        Element root = document.getDocumentElement();
//        NodeList childNodes = root.getChildNodes();
//        for (int i = 0; i < childNodes.getLength(); i++) {
//            //判断元素(xml中的标签类型)
//            if (!(childNodes.item(i) instanceof Element)) {
//                continue;
//            }
//            //判断标签名
//            if (!"bean".equals(childNodes.item(i).getNodeName())) {
//                continue;
//            }
//            //解析标签
//            Element bean = (Element) childNodes.item(i);
//            String id = bean.getAttribute("id");
//            String name = bean.getAttribute("name");
//            String className = bean.getAttribute("class");
//            String initMethod = bean.getAttribute("init-method");
//            String destroyMethodName = bean.getAttribute("destroy-method");
//            String beanScope = bean.getAttribute("scope");
//            //获取Class对象，方便获取类中的名称
//            Class<?> clazz = Class.forName(className);
//            //优先级id>name的实现
//            String beanName = StrUtil.isNotEmpty(id) ? id : name;
//            if (StrUtil.isEmpty(beanName)) {
//                beanName = StrUtil.lowerFirst(clazz.getSimpleName());
//            }
//            //定义Bean
//            BeanDefinition beanDefinition = new BeanDefinition(clazz);
//            beanDefinition.setDestroyMethodName(destroyMethodName);
//            beanDefinition.setInitMethodName(initMethod);
//            if (StrUtil.isNotEmpty(beanScope)) {
//                beanDefinition.setScope(beanScope);
//            }
//            //读取属性并填充
//            for (int j = 0; j < bean.getChildNodes().getLength(); j++) {
//                if (!(bean.getChildNodes().item(j) instanceof Element)) {
//                    continue;
//                }
//                //解析标签 <property/>
//                if (!"property".equals(bean.getChildNodes().item(j).getNodeName())) {
//                    continue;
//                }
//                Element property = (Element) bean.getChildNodes().item(j);
//                String attrName = property.getAttribute("name");
//                String attrValue = property.getAttribute("value");
//                String attrRef = property.getAttribute("ref");
//                //获取属性值，引入对象，值对象，不为空说明有引用，那么创建引用，否则为空
//                Object value = StrUtil.isNotEmpty(attrRef) ? new BeanReference(attrRef) : attrValue;
//                PropertyValue propertyValue = new PropertyValue(attrName, value);
//                beanDefinition.getPropertyValues().addPropertyValue(propertyValue);
//            }
//            //避免重复注册
//            if (getRegistry().containsBeanDefinition(beanName)) {
//                throw new BeansException("Duplicate beanName[" + beanName + "] is not allowed");
//            }
//            //注册beanDefinition
//            getRegistry().registerBeanDefinition(beanName, beanDefinition);
//        }
//
//    }
//}
